home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Calls; (* V#055 *)⓪ (*$Y+,L-,C-,H+*)⓪ ⓪ (*⓪"24.5.88: Stack bei CallSuperVisor muß nun 128 statt 512 Byte groß sein.⓪"29.8.88: Wirkung v. SysNewCaller und NewCaller war vertauscht; Funktionen⓪+nun lauffähig.⓪"26.7.89: Sys/NewCaller legen Entry-Prg im wsp ab - nun kein ALLOCATE mehr⓪+nötig⓪"10.5.90: CallExternal & CallSystem entfernt⓪"13.6.90: EnterSupervisorMode-Aufrufe raus⓪"24.10.90: $H+ eingebaut⓪"21.11.90: Korrektur bei NewCaller (Stack-Pointer und Call-Adr. wurden wg.⓪,Entfernung von $M- nicht mehr an die richtige Adr. gesetzt).⓪ *)⓪ ⓪ FROM SYSTEM IMPORT LONGWORD, ASSEMBLER, ADDRESS;⓪ ⓪ FROM MOSGlobals IMPORT OutOfStack, MemArea;⓪ ⓪ (*⓪ PROCEDURE CallExternal ( func: ADDRESS ): LONGWORD;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),A0 ; Adr. der aufzurufenden Funktion⓪(MOVE.L (A7)+,(A3)+ ; Rücksprungadr. auf anderen Stack retten⓪(MOVE.L (A7)+,(A3)+ ; gerettetes A6⓪(JSR (A0)⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L -(A3),A0⓪(MOVE.L D0,(A3)+⓪(JMP (A0) ; Zurück zum Aufrufer⓪$END⓪"END CallExternal;⓪ *)⓪ ⓪ PROCEDURE CallExtRegs ( pro: ADDRESS; VAR regs: Registers );⓪ BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),A0⓪(MOVE.L -(A3),A1 ; Adr. der aufzurufenden Funktion⓪(MOVEM.L D3-D7/A3-A6,-(A7)⓪(MOVE.L A0,-(A7)⓪(PEA ret(PC)⓪(PEA (A1)⓪(MOVEM.L (A0),D0-A6⓪(RTS⓪&ret:⓪(MOVE.L A6,-(A7)⓪(MOVE.L 4(A7),A6⓪(MOVEM.L D0-A5,(A6)⓪(MOVE.L (A7)+,56(A6)⓪(ADDQ.L #4,A7⓪(MOVEM.L (A7)+,D3-D7/A3-A6⓪$END⓪"END CallExtRegs;⓪ ⓪ ⓪ (*⓪ VAR trapHelp: RECORD⓪0t1:CARDINAL; (* TRAP #n *)⓪0t2:CARDINAL; (* ADDQ.L #2,A7 ; Funktionsnr. runter *)⓪0t3:CARDINAL; (* MOVE.L -(A3),-(A7); gerettetes A6 *)⓪0t5:CARDINAL; (* MOVE.L -(A3),A0 ; Rücksprungadr. *)⓪0t6:CARDINAL; (* MOVE.L D0,(A3)+ ; Ergebnis auf Stack *)⓪0t7:CARDINAL (* JMP (A0) *)⓪.END;⓪.⓪ PROCEDURE CallSystem ( trapNo, func:CARDINAL ): LONGWORD;⓪"BEGIN⓪$ASSEMBLER⓪(MOVEM.L (A7)+,D0/D2 ; Rücksprungadr. + gerettetes A6 laden⓪(MOVE.W -(A3),-(A7)⓪(MOVE.W -(A3),D1⓪(ORI #$4E40,D1 ; TRAP #0⓪(LEA trapHelp,A0⓪(MOVE.W D1,(A0) ; TRAP-Instr. setzen⓪(MOVEM.L D0/D2,(A3) ; Rücksprungadr. auf anderen Stack retten⓪(ADDQ.L #8,A3⓪(JMP (A0)⓪$END⓪"END CallSystem;⓪ *)⓪ ⓪ PROCEDURE CallProc ( func: AddrProc; p: ADDRESS; REF workSpace: MemArea );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),A0 ; workSpace⓪(MOVE.L -(A3),A2 ; p⓪(MOVE.L -(A3),D2 ; StatLink ('func')⓪(MOVE.L -(A3),A1 ; ADR ('func')⓪(⓪(; Stack anlegen⓪(MOVE.L A3,-(A7) ; A3 retten⓪(MOVE.L A7,D1 ; alten SP laden zum Retten⓪(⓪(TST.L MemArea.bottom(A0) ; neuen SP-Bottom⓪(BEQ stckerr ; Fehler⓪(MOVE.L MemArea.length(A0),D0⓪(BEQ stckerr ; Fehler⓪(⓪(CMPI.L #16,D0 ; Den Rest checkt die aufzurufende Prozedur⓪(BCS stckerr⓪(⓪(; neuen SP verwenden⓪(MOVE.L MemArea.bottom(A0),A3⓪(ADD.L MemArea.bottom(A0),D0⓪(MOVE.L D0,A7⓪(⓪&useOld⓪(; para auf Stack⓪(MOVE.L A2,(A3)+⓪(⓪(MOVE.L D1,-(A7) ; alten SP retten⓪(⓪(; Funktion aufrufen⓪(JSR (A1) ; static link steht schon in D2⓪(⓪(MOVE.L (A7)+,A7⓪(MOVE.L (A7)+,A3⓪(RTS⓪(⓪&stckerr:⓪(TRAP #6⓪(DC.W OutOfStack ; continue erlaubt⓪(BRA useOld⓪$END⓪"END CallProc;⓪ ⓪ PROCEDURE CallSupervisor ( proc: AddrProc; data: ADDRESS; REF wsp: MemArea );⓪"BEGIN⓪$ASSEMBLER⓪(CLR.L -(A7)⓪(MOVE #$20,-(A7)⓪(TRAP #1⓪(ADDQ.L #6,A7⓪(MOVE.L A7,USP⓪(MOVE.L D0,A7⓪(⓪(MOVE.L -(A3),A2 ; workSpace⓪(MOVE.L -(A3),D1 ; para⓪(MOVE.L -(A3),D2 ; StatLink ('func')⓪(MOVE.L -(A3),A1 ; Funktionsadr.⓪(⓪(MOVE.L A3,-(A7)⓪(⓪(; Stack anlegen⓪(MOVE.L A7,A0 ; alten SSP laden zum Retten⓪(MOVE.L USP,A7 ; USP ist default-SP⓪(⓪(TST.L MemArea.bottom(A2) ; neuen SP-Bottom⓪(BEQ useOld⓪(MOVE.L MemArea.length(A2),D0⓪(BEQ useOld⓪(⓪(CMPI.L #128,D0 ; Muß schon da sein für evtl. Interrupts⓪(BCS stckerr⓪(⓪(; neuen SP verwenden⓪(MOVE.L MemArea.bottom(A0),A3⓪(ADD.L MemArea.bottom(A0),D0⓪(MOVE.L D0,A7⓪(⓪&useOld:⓪(; para auf Stack⓪(MOVE.L D1,(A3)+⓪(⓪(MOVE.L A0,-(A7) ; alten SP retten⓪(⓪(; Funktion aufrufen⓪(JSR (A1) ; static link steht schon in D2⓪(⓪(MOVE.L (A7)+,A7 ; alten SSP wiederherstellen⓪(MOVE.L (A7)+,A3⓪(⓪(ANDI #$CFFF,SR⓪(RTS⓪(⓪&stckerr:⓪(TRAP #6⓪(DC.W OutOfStack ; continue erlaubt⓪(BRA useOld⓪$END⓪"END CallSupervisor;⓪ ⓪ ⓪ PROCEDURE hdlCaller1;⓪"BEGIN⓪$ASSEMBLER⓪(PEA (A6) ; A6 auf Stack⓪(LEA regs(PC),A6 ; Adr f. zu rettende Regs D0-A7⓪(MOVEM.L D0-A5,(A6) ; regs D0-A5 retten⓪(MOVE.L (A7)+,Registers.regA6(A6) ; A6 von Stack retten⓪(MOVE.L A7,A4 ; SP merken⓪(LEA $F1210000,A3 ; neuen Stack laden⓪(LEA $F1210000,A7⓪(LEA 4(A4),A0⓪(MOVE.L A0,Registers.parm(A6) ; alten SP als A7 merken⓪(MOVE.L A6,(A3)+⓪(; SUBA.L A5,A5 ; LINK-^ löschen (f. Error-Scanner)⓪(JSR $F1210000⓪(MOVE.L A4,A7 ; alten SP zurück⓪(MOVEM.L (A6),D0-A6⓪(RTS⓪®s:⓪(DS 64⓪$END⓪"END hdlCaller1;⓪ ⓪ PROCEDURE hdlCaller1E; END hdlCaller1E;⓪ ⓪ PROCEDURE hdlCaller2; (* für Supervisormode -> Usermode *)⓪"BEGIN⓪$ASSEMBLER⓪(PEA (A6) ; A6 auf Stack⓪(LEA regs(PC),A6⓪(MOVEM.L D0-A5,(A6)⓪(MOVE.L (A7)+,Registers.regA6(A6)⓪(MOVE.L A7,A4 ; alter SSP⓪(MOVE.L USP,A5 ; alter USP⓪(⓪(ANDI #$CFFF,SR ; User Mode⓪(LEA $F1210000,A3 ; neuen Stack laden⓪(LEA $F1210000,A7⓪(LEA 4(A4),A0⓪(MOVE.L A0,Registers.parm(A6)⓪(MOVE.L A6,(A3)+⓪(JSR $F1210000⓪(⓪(; zurück in den Supervisor-Mode⓪(CLR.L -(A7)⓪(MOVE #$20,-(A7)⓪(TRAP #1⓪(ADDQ.L #6,A7⓪(⓪(MOVE.L A5,USP⓪(MOVE.L A4,A7 ; alten SSP zurück⓪(⓪(MOVEM.L (A6),D0-A6⓪(RTS⓪®s:⓪(DS 64⓪$END⓪"END hdlCaller2;⓪ ⓪ PROCEDURE hdlCaller2E; END hdlCaller2E;⓪ ⓪ (*$H-*)⓪ PROCEDURE NewCaller ( m2Proc : RegsProc;⓪:enterUserMode: BOOLEAN;⓪:wsp : MemArea;⓪6VAR entry : ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -(A3),-(A7) ; ADR (entry)⓪(MOVE.L -(A3),D2 ; wsp.length⓪(MOVE.L -(A3),A0 ; wsp.bottom⓪(MOVE.W -(A3),D0 ; enterUserMode⓪(MOVE.L -(A3),-(A7) ; m2Proc⓪ ⓪(MOVE.L 4(A7),A1⓪(CLR.L (A1) ; entry:= NIL⓪ ⓪(TST.W D0⓪(BEQ noEnter⓪(LEA hdlCaller2,A1 ; p1⓪(LEA hdlCaller2E,A2 ; p2⓪(BRA entCont⓪&noEnter⓪(LEA hdlCaller1,A1⓪(LEA hdlCaller1E,A2⓪&entCont⓪ ⓪(MOVE.L A2,D0⓪(SUB.L A1,D0 ; l: Länge der Eintrittsprozedur⓪ ⓪(MOVE.L A0,D1 ; wsp.bottom⓪(BEQ noStack⓪(MOVE.L D0,D1 ; l⓪(ADDI.L #512,D1⓪(CMP.L D1,D2 ; l, wsp.length⓪(BCS noStack⓪ ⓪(MOVE.L A0,-(A7)⓪&l0:⓪(MOVE.W (A1)+,(A0)+ ; (p1)+ -> (wsp.bottom)+⓪(CMPA.L A2,A1⓪(BCS l0⓪(MOVE.L (A7)+,D0 ; wsp.bottom⓪ ⓪(MOVE.L 4(A7),A1⓪(MOVE.L D0,(A1) ; entry:= wsp.bottom⓪ ⓪(; Jetzt suchen wir nach Kennungen, wo Adressen nachzutragen sind.⓪(MOVE.L D0,A1 ; wsp.bottom⓪#sea1 CMPI.W #$F121,(A1)+⓪(BNE sea1⓪(MOVE.L A0,-2(A1) ; wsp.bottom+l -> stcklo⓪#sea2 CMPI.W #$F121,(A1)+⓪(BNE sea2⓪(ADD.L D0,D2⓪(MOVE.L D2,-2(A1) ; wsp.bottom+wsp.length -> stckhi⓪#sea3 CMPI.W #$F121,(A1)+⓪(BNE sea3⓪(MOVE.L (A7),-2(A1) ; call⓪(BRA ende⓪ ⓪&noStack⓪(TRAP #6⓪(DC.W OutOfStack ; continue erlaubt⓪&ende⓪(ADDQ.L #8,A7⓪$END;⓪$(*⓪(IF enterUserMode THEN⓪*p1:= ADDRESS (hdlCaller2);⓪*p2:= ADDRESS (hdlCaller2E)⓪(ELSE⓪*p1:= ADDRESS (hdlCaller1);⓪*p2:= ADDRESS (hdlCaller1E)⓪(END;⓪(l:=p2-p1;⓪(IF l+512L > wsp.length THEN⓪*ASSEMBLER⓪,TRAP #6⓪,DC.W OutOfStack ; continue erlaubt⓪*END⓪(END;⓪(entry:= wsp.bottom;⓪(IF entry # NIL THEN⓪*ASSEMBLER⓪,MOVE.L p1(A6),A0⓪,MOVE.L entry(A6),A1⓪,MOVE.L (A1),A1⓪,MOVE.L p2(A6),A2⓪*l0:⓪,MOVE.W (A0)+,(A1)+⓪,CMPA.L A2,A0⓪,BCS l0⓪*END;⓪*p3:= entry + l - 14L;⓪*p3^:= entry + l;⓪*INC (p3,4);⓪*p3^:= entry+wsp.length;⓪*INC (p3,4);⓪*p3^:= ADDRESS(m2Proc)⓪(END⓪$*)⓪"END NewCaller;⓪ ⓪ PROCEDURE SysNewCaller ( m2Proc: RegsProc; enterUserMode: BOOLEAN; wsp: MemArea; VAR entry: ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(JMP NewCaller⓪$END⓪"END SysNewCaller;⓪ ⓪ PROCEDURE DisposeCaller ( VAR entry: ADDRESS );⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L #4,A3⓪$END⓪"END DisposeCaller;⓪ ⓪ BEGIN⓪"(*⓪$trapHelp.t2:= $548F; (* ADDQ.L #2,A7 *)⓪$trapHelp.t3:= $2F23; (* MOVE.L -(A3),-(A7) *)⓪$trapHelp.t5:= $2063; (* MOVE.L -(A3),A0 *)⓪$trapHelp.t6:= $26C0; (* MOVE.L D0,(A3)+ *)⓪$trapHelp.t7:= $4ED0; (* JMP (A0) *)⓪"*)⓪ END Calls.⓪ ə
- (* $FFFA9A0B$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$00002113$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277D$FFFC277DÇ$000014DAT.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001DB1$00001E08$00001E53$000014DA$000014C5$00001DE7$00001CEA$00001492$00001713$00001CD8$00001DE7$00001D71$00001D36$00001D71$00001D33$00001DD5öÇâ*)
-